<?php

class Reis_model extends CI_Model {

    /**
     * Haal overzicht op van alle reizen die momenteel nog geboekt kunnen worden.
     * 
     * @param array $filters
     * @return object - recordset als object 
     */
    public function getReizen($filters, $offset, $per_page) {
        $selection = '';
        $limit = '';
        if ($filters) {
            //Query uitbreiden met gezette filters
            foreach ($filters as $filter => $value) {
                switch ($filter) {
                    case 'reistype':
                        $selection .= ' AND rt.id = ' . $this->db->escape($value);
                        break;
                    case 'continent':
                        $selection .= ' AND c.id = ' . $this->db->escape($value);
                        break;
                    case 'land':
                        $selection .= ' AND l.id = ' . $this->db->escape($value);
                        break;
                    case 'zoek':
                        $values = explode(' ', $value);
                        foreach ($values as $value) {
                            $selection .= ' AND (
								r.omschrijving LIKE ' . $this->db->escape('%' . $value . '%') . ' OR
								r.naam LIKE ' . $this->db->escape('%' . $value . '%') . ' OR
								rt.naam LIKE ' . $this->db->escape('%' . $value . '%') . ' OR
								rt.beschrijving LIKE ' . $this->db->escape('%' . $value . '%') . '
							)';
                        }
                        break;
                    default:
                        break;
                }
            }
        }

        //Limiet voor paginatie
        $limit = "Limit $offset, $per_page";


        $queryString = ('
            SELECT r.id AS rID, r.naam as rNaam, r.afbeelding, r.duur, p.bedrag, 
			DATE_FORMAT(p.datum_van, "%e-%c-%Y") AS van,
                p.aantal_maximum - IFNULL(rs.aantal, 0) AS plekVrij
            FROM reis r 
                INNER JOIN (SELECT * FROM planning ORDER BY datum_van) p ON (p.reis_id = r.id)
                INNER JOIN reistype rt ON (r.reistype_id = rt.id)
                INNER JOIN land l ON (r.land_id = l.id)
                INNER JOIN continent c ON (l.continent_id = c.id)
                LEFT JOIN (
                    SELECT planning_id, COUNT(d.id) AS aantal FROM reservering
                        INNER JOIN deelnemer d ON (d.reservering_id = reservering.id)
					GROUP BY planning_id
                ) rs ON (p.id = rs.planning_id)
            WHERE p.datum_van > NOW() AND IFNULL(rs.aantal, 0) < p.aantal_maximum
            ' . $selection . '
			GROUP BY r.id
            ');


        //Lees aantal rijen voor paginatie
        $query = $this->db->query($queryString);
        $num_row = $query->num_rows();
        //Query met paginatie
        $queryString = $queryString . $limit;
        $query = $this->db->query($queryString);

        return array('result' => $query->result(), 'num_rows' => $num_row);
    }

    /**
     * Haal de detail gegevens van de gegeven reis op.
     * 
     * @param string $reisID
     * @return object - eerste rij recordset als object
     */
    public function getReisDetail($reisID) {
        if (!isset($reisID)) {
            return false;
        }

        $query = $this->db->query('
            SELECT r.naam as rNaam, r.afbeelding, r.duur, rt.naam AS rtNaam, 
                l.naam AS lNaam, c.Naam AS cNaam, p.bedrag, DATE_FORMAT(p.datum_van, "%e-%c-%Y") AS van,
                DATE_FORMAT(p.datum_tot, "%e-%c-%Y") AS tot, r.omschrijving
            FROM reis r
                INNER JOIN planning p ON (r.id = p.reis_id)
                INNER JOIN reistype rt ON (r.reistype_id = rt.id)
                INNER JOIN land l ON (r.land_id = l.id)
                INNER JOIN continent c ON (l.continent_id = c.id)
            WHERE r.id = ' . $this->db->escape($reisID)
        );

        //Query zou maar 1 resultaat moeten geven, maar voor de zekerheid enkel eerste rij teruggeven
        return $query->row();
    }

    /**
     * Haal alle planningen bij gegeven reis op die nog geboekt kunnen worden.
     * 
     * @param string $reisID
     * @return object - recordset als object 
     */
    public function getReisPlanningen($reisID) {
        if (!isset($reisID)) {
            return false;
        }
        /* Alle planningen bij gegeven reisID die in de toekomst gepland zijn
         * en waarvan het maximum aantal deelnemers nog niet bereikt is.
         */
        $query = $this->db->query('
            SELECT p.id, DATE_FORMAT(p.datum_van, "%e-%c-%Y") AS van,
                DATE_FORMAT(p.datum_tot, "%e-%c-%Y") AS tot, p.bedrag
            FROM planning p
                INNER JOIN reis r ON (r.id = p.reis_id)
                LEFT JOIN (
                    SELECT planning_id, COUNT(d.id) AS aantal FROM reservering
                        INNER JOIN deelnemer d ON (d.reservering_id = reservering.id) 
                ) rs ON (p.id = rs.planning_id)
            WHERE r.id = ' . $this->db->escape($reisID) . ' 
                AND p.datum_van > NOW() AND IFNULL(rs.aantal, 0) < p.aantal_maximum
			ORDER BY p.datum_van'
        );

        return $query->result();
    }

}

?>
